package br.com.tautologia.mc.parcelamento;

import java.util.ArrayList;
import java.util.List;

import org.joda.time.DateTimeConstants;
import org.joda.time.LocalDate;

import br.com.tautologia.mc.parcelamento.dominio.Parcela;
import br.com.tautologia.mc.parcelamento.dominio.PeriodicidadeEnum;

public class Parcelamento {

	private LocalDate dataOperacao;
	private Boolean calcularSomenteDiasUteis;
	private PeriodicidadeEnum periodicidade;
	private Integer quantidadeParcelas;
	private List<Parcela> parcelas;

	public Parcelamento(LocalDate dataOperacao, Integer quantidadeParcelas, Boolean calcularSomenteDiasUteis, PeriodicidadeEnum periodicidade) {
		this.dataOperacao = dataOperacao;
		this.quantidadeParcelas = quantidadeParcelas;
		this.calcularSomenteDiasUteis = calcularSomenteDiasUteis;
		this.periodicidade = periodicidade;
	}

	public List<Parcela> calcular() {

		parcelas = new ArrayList<Parcela>();

		LocalDate dataParcela = proximoDiaUtil(dataOperacao);
		
		Parcela parcelaAnterior = null;

		for (int i = 0; i < quantidadeParcelas; i++) {
			
			Parcela parcelaAtual = new Parcela(parcelaAnterior, proximoDiaUtil(dataParcela));
			
			parcelas.add(parcelaAtual);
			
			dataParcela = proximaData(dataParcela);
			
			parcelaAnterior = parcelaAtual;
		}

		return parcelas;
	}

	protected LocalDate proximoDiaUtil(LocalDate data) {

		if (calcularSomenteDiasUteis && isNotDiaUtil(data)) {

			return proximoDiaUtil(data.plusDays(1));
		}
		return data;
	}

	private boolean isNotDiaUtil(LocalDate data) {
		// TODO levar em conta o feriado
		return data.getDayOfWeek() == DateTimeConstants.SATURDAY || data.getDayOfWeek() == DateTimeConstants.SUNDAY;
	}

	protected LocalDate proximaData(LocalDate dataParcela) {

		return dataParcela.plusMonths(periodicidade.getQuantidadeMeses());
	}

}
